import java.util.*;
import java.lang.Math; // biblioteka potrzebna do obliczeĂ�Â± matematycznych

public class Liczba
{
	Liczba()
	{
                // przypadek dla domyĂ‚Âślnego konstruktora
		liczbaWSystemieDziesietnym = 0;
		pierwotnaLiczba = "0";
		pierwotnaPodstawa = 2;
	}
	
	Liczba(int n)
	{
                    //konstruktor innicjujĂ‚Âący klasĂ�ÂŞ przy uĂ‚Âżyciu liczby w systemi 8,10,16
            liczbaWSystemieDziesietnym = n;
	}
	
	Liczba(String n, int podstawa) throws LiczbaException
	{
            //przypadek w ktĂ�Âłrym powinno wyĂ‚ÂświetliĂ�Â¦ nam bĂ‚ÂłĂ‚Âąd
		if(podstawa < 2 || podstawa > 17)
			throw new LiczbaException("BLAD: podstawa \"" + podstawa + "\" nie jest z zakresu 2-17.");
		
                //zwracamy duĂ‚ÂżĂ‚Âą liczbĂ�ÂŞ, zamieniamy wszystkie litery na duĂ‚Âże (toUpperCase)
		pierwotnaLiczba = n.toUpperCase();
                //przechowuje jakĂ‚Âą podstawe miaĂ‚Âła liczba zainicjowana
		pierwotnaPodstawa = podstawa;
                //pĂ�ÂŞtla konwertujĂ‚Âąca na zapis dziesiĂ�ÂŞtny
		try {
                    //obsĂ‚ÂłuĂ‚Âżony wyjĂ‚Âątek
			KonwertujNaSystemDziesietny();
		} catch(LiczbaException e) {
			throw e;
		}
	}
	 // metoda Zapis zwraca zapisanĂ‚Âą liczbĂ�ÂŞ w rzĂ‚Âądanym systemie o rzĂ‚Âądanej podstawie
	public String Zapis(int podstawa) throws LiczbaException
	{
		if(podstawa < 2 || podstawa > 17)
			throw new LiczbaException("BLAD: podstawa \"" + podstawa + "\" nie jest z zakresu 2-17.");
		//przechowujemy wew liczbĂ�ÂŞ w systemie dziesiĂ�ÂŞtnym
		else if(podstawa == pierwotnaPodstawa) return pierwotnaLiczba;
		//zamiana liczb, gdy koĂ�Â±czy siĂ�ÂŞ zakres --> musi byĂ�Â¦ przekonwerowane na string, bo metoda zwraca String
		else if(podstawa == 10) return Integer.toString(liczbaWSystemieDziesietnym);
		
		else {
                        // tworzymy dynamicznĂ‚Âą tablicĂ�ÂŞ
			int dzielna = liczbaWSystemieDziesietnym;
			ArrayList<String> al = new ArrayList<String>();
	//petla while, ktĂ�Âłra jest potrzebna by wiedzieĂ�Â¦ kiedy skoĂ�Â±czyĂ�Â¦ konwertowanie
                        //w while tworzymy pusty String i wypeĂ‚Âłniamy go znakami przez dzielenie modulo
                        while(dzielna > 0) {
                            //zamiana cyfry w znak
				al.add(Character.toString(cyfry[dzielna % podstawa]));
				dzielna /= podstawa;
			}
                        //tworzy nowe miejsce wypeĂ‚Âłnione liczbĂ‚Âą i idziemy dalej
			String wynik = new String();
			for(int i = 0; i < al.size(); ++i)
				wynik += (String)al.get(i);
			
			return wynik;
		}
	}
	
	private void KonwertujNaSystemDziesietny() throws LiczbaException
                //przypadek kiedy nie wpisujemy nic lub 0
	{
		if(pierwotnaLiczba.isEmpty()) throw new LiczbaException("BLAD: podano pusty lancuch.");
		if(pierwotnaLiczba.equals("0")) {
			liczbaWSystemieDziesietnym = 0;
			return;
		}
                // w akumulatorze jest przeliczana liczba na system dziesiĂ�ÂŞtny
		int akumulator = 0, tmp;
                // toCharArray uĂ‚Âżywamy do przekszatĂ‚Âłcenia ciĂ‚Âągu do nowej tablicy
		char[] ciag = pierwotnaLiczba.toCharArray();
                //wyĂ‚Âłapujemy ostatni znak ciĂ‚Âągu
		int ostatniElementCiagu = ciag.length - 1;
		
                //zmaniamy liczby idĂ‚Âąc od koĂ�Â±ca (od prawej strony)
		for(int i = ostatniElementCiagu; i >= 0; --i) {
                        //sortowanie elementĂ�Âłw tablicy
			tmp = Arrays.binarySearch(cyfry, ciag[i]);
			if(tmp >= 0 && tmp < pierwotnaPodstawa)
				akumulator += tmp * (int)Math.pow(pierwotnaPodstawa, ostatniElementCiagu - i);
			else
				throw new LiczbaException("BLAD: " + pierwotnaLiczba + " nie jest poprawna liczba.");
		
		}
		liczbaWSystemieDziesietnym = akumulator;
	}
	
	private int liczbaWSystemieDziesietnym;
                //cyfry w systemie szesnastkowym
	private static char[] cyfry = 
		{ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G' };
	private String pierwotnaLiczba;
	private int pierwotnaPodstawa;
}